package com.tmc.service.baseinfo;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.tmc.bean.common.CommonResult;
import com.tmc.bean.common.ContextInfo;
import com.tmc.bean.common.Pagination;
import com.tmc.constant.CacheConstant;
import com.tmc.dao.impl.CityDaoImpl;
import com.tmc.dao.impl.CountryDaoImpl;
import com.tmc.entity.baseinfo.Airport;
import com.tmc.entity.baseinfo.City;
import com.tmc.entity.baseinfo.Country;
import com.tmc.service.cache.CacheServiceImpl;
import com.tmc.util.ObjectUtil;

@Service
@Transactional
public class CountryServiceImpl {

	@Autowired
	private CountryDaoImpl dao;

	@Autowired
	private CityDaoImpl cityDao;

	/*@Autowired
	private ContinentDaoImpl continentDao;*/
	
	@Autowired
	private CacheServiceImpl cache;
	
	private static String all_key = "KEY_COUNTRY_ALL";
	
	private static String map_key = "KEY_COUNTRY_ALL_MAP";

	private Log logger = LogFactory.getLog(this.getClass());

	public Pagination<Country> findByCon(ContextInfo context, Country cond, int pageIndex, int pageSize) {
		Pagination<Country> result = dao.findByCon(context, cond, pageIndex, pageSize);
		this.setExtInfo(result);
		return result;
	}

	public Country getByCode(String code) {
		if (ObjectUtil.noText(code)) {
			return null;
		}
		List<Country> countrys = this.findAllFromCache();
		for (Country country : countrys) {
			if (country.getCountryCode().equals(code)) {
				return country;
			}
		}
		return null;
	}
	
	public String getNameByCode(String code){
		Country bean = this.getByCode(code);
		if (bean == null){
			return "";
		}
		return bean.getCountryName();
	}

	public List<Country> findAllFromCache() {
		if (cache.get(CacheConstant.CACHE_NAME_600, all_key) != null) {
			return (List<Country>) cache.get(CacheConstant.CACHE_NAME_600, all_key);
		}
		List<Country> list = dao.findAll();
		cache.put(CacheConstant.CACHE_NAME_600, all_key, list);
		return list;
	}

	public Map<String, Country> findMapFromCache(ContextInfo context) {
		if (cache.get(CacheConstant.CACHE_NAME_600, map_key) != null) {
			return (Map<String, Country>) cache.get(CacheConstant.CACHE_NAME_600, map_key);
		}
		Map<String, Country> map = this.toMap(this.findAllFromCache());
		cache.put(CacheConstant.CACHE_NAME_600, map_key, map);
		return map;
	}

	private Map<String, Country> toMap(List<Country> countrys) {
		Map<String, Country> map = new HashMap<String, Country>();
		for (Country country : countrys) {
			map.put(country.getCountryCode(), country);
		}
		return map;
	}

	@CacheEvict(value = CacheConstant.CACHE_NAME_600, key = "'KEY_COUNTRY_ALL'")
	public CommonResult delete(ContextInfo context, Long countryId) {
		Country country = dao.getById(countryId);
		if (country != null) {
			ObjectUtil.updateBaseInfo(country, context);
			country.setEnabledFlag("N");
			dao.update(country);
		}
		return CommonResult.makeSuccess("删除成功！");
	}

	public Country getById(ContextInfo context, Long countryId) {
		return dao.getById(countryId);
	}

	@CacheEvict(value = CacheConstant.CACHE_NAME_600, key = "'KEY_COUNTRY_ALL'")
	public CommonResult save(ContextInfo context, Country country) {
		CommonResult check = this.check(country);
		if (!check.isSuccess()) {
			return check;
		}
		// 保存
		if (country.getCountryId() == null) {
			ObjectUtil.setBaseInfo(country, context);
			dao.insert(country);
		} else {
			// 编辑
			try {
				Country dbCountry = dao.getById(country.getCountryId());
				if (dbCountry != null) {
					ObjectUtil.copyProperties(country, dbCountry,
							new String[] { "createdBy", "creationDate", "countryId", "enabledFlag" });
				}
				ObjectUtil.updateBaseInfo(dbCountry, context);
				dao.update(dbCountry);
			} catch (Exception e) {
				logger.error("拷贝对象错误！", e);
				return CommonResult.makeFail("拷贝对象错误！");
			}
		}
		return CommonResult.makeSuccess();
	}

	private CommonResult check(Country Country) {
		if (!ObjectUtil.hasText(Country.getCountryCode())) {
			return CommonResult.makeFail("国家二字码不能为空！");
		}
		if (!ObjectUtil.hasText(Country.getCountryName())) {
			return CommonResult.makeFail("国家名字不能为空！");
		}
		/*
		 * if (!ObjectUtil.hasText(airport.getCountryCode())){ return
		 * CommonResult.makeFail("所属城市不能为空！"); }
		 */
		return CommonResult.makeSuccess();
	}

	private void setExtInfo(Pagination<Country> result) {
		// TODO Auto-generated method stub

	}

	public void updateFromCity(ContextInfo context) {
		List<City> citys = cityDao.findAll(context);
		for (City city : citys) {
			if (ObjectUtil.hasText(city.getCountryCode())) {
				Country dbCountry = dao.getByCode(context, city.getCountryCode());
				if (dbCountry == null) {
					System.out.println("添加国家" + city.getCountryCode());
					Country Country = new Country();
					Country.setCountryCode(city.getCountryCode());
					Country.setCountryName(city.getCountryName());
					Country.setCountryNameEn(city.getCountryNameEn());
					Country.setCountryCode(city.getCountryCode());
					Country.setCountryName(city.getCountryName());
					Country.setCountryNameEn(city.getCountryNameEn());
					Country.setContinentCode(city.getContinentCode());
					Country.setContinentName(city.getContinentName());
					Country.setContinentNameEn(city.getContinentNameEn());
					ObjectUtil.setBaseInfo(Country, context);
					dao.insert(Country);
				}
			}
		}
		System.out.println("处理完毕");
	}

	public void updateFromContinent1(ContextInfo context) {
		/*
		 * List<Country> countrys = dao.findAll(context); List<Continent>
		 * continents = continentDao.findAll(context); if (continents == null ||
		 * continents.isEmpty()) { return; } for (Country country : countrys) {
		 * String countryCode = country.getCountryCode(); String names = "";
		 * String namesEn = ""; for (Continent continent : continents) { String
		 * countryCodes = continent.getCountryCodes(); if
		 * (countryCodes.contains(countryCode + "/")) { names +=
		 * continent.getContinentName() + "/"; namesEn +=
		 * continent.getContinentNameEn() + "/"; } } if
		 * (ObjectUtil.hasText(names)) { names = names.substring(0,
		 * names.length() - 1); } if (ObjectUtil.hasText(namesEn)) { namesEn =
		 * namesEn.substring(0, namesEn.length() - 1); }
		 * country.setContinentName(names); country.setContinentNameEn(namesEn);
		 * } dao.update(countrys);
		 */
		String area1 = "北美洲：包括阿拉斯加、加拿大、美国大陆、夏威夷、墨西哥、圣皮埃尔和密克隆 " + "中美洲：包括伯利兹、哥斯达黎加、萨尔瓦多、危地马拉、洪都拉斯、尼加拉瓜 "
				+ "南美次区：包括阿根廷、玻利维亚、巴西、智利、哥伦比亚、厄瓜多尔、法属圭亚那、圭亚那、巴拿马、巴拉圭、秘鲁、苏里南、乌拉圭、"
				+ "委内瑞拉 加勒比次区：包括巴哈马、百慕大、加勒比群岛、圭亚那、法属圭亚那、苏里南" + "包括加拿大、格陵兰、墨西哥、圣皮埃尔和密克隆、美国"
				+ "包括安圭拉、安提瓜和巴布达、阿鲁巴、巴哈马、巴巴多斯、贝利兹、百慕大、玻利维亚、开曼群岛、哥伦比亚、哥斯达黎加、"
				+ "古巴、多米尼克、多米尼加共和国、厄瓜多尔、萨尔瓦多、法属圭亚那、格林纳达、瓜德罗普、危地马拉、圭亚那、海地、洪都拉斯、牙买加、马提尼克、蒙特赛拉特、"
				+ "荷属安的列斯、尼加拉瓜、巴拿马、秘鲁、圣基茨和尼维斯、圣卢西亚、圣文森特和格林纳丁斯、苏里南、特立尼达和多巴哥、特克斯和凯科斯群岛、委内瑞拉、英属维尔京群岛"
				+ "包括阿根廷、巴西、智利、巴拉圭、乌拉圭";
		String area2 = "包括阿尔巴尼亚、阿尔及利亚、安道尔、亚美尼亚、奥地利、阿塞拜疆、白俄罗斯、比利时、波斯尼亚和黑塞哥维那、保加利亚、克罗地亚、塞浦路斯、捷克共和国、"
				+ "丹麦、爱沙尼亚、法罗群岛、芬兰、法国、格鲁吉亚、德国、直布罗陀、希腊、匈牙利、冰岛、爱尔兰、意大利、拉托维亚、列支敦士登、立陶宛、卢森堡、马其顿、马尔他、"
				+ "摩纳哥、摩尔多瓦、摩洛哥、荷兰、挪威、波兰、葡萄牙（包括亚速尔群岛和马德拉群岛）、罗马尼亚、俄罗斯（乌拉尔山以西部分）、圣马力诺、斯洛伐克、斯洛文尼亚、"
				+ "西班牙（包括巴利阿里群岛和加那利群岛）、瑞士、瑞典、突尼斯、土耳其、乌克兰、英国、南斯拉夫" + "包括丹麦（格陵兰除外）、挪威、瑞典（运价计算时，上述三国应被视为是同一国）"
				+ "奥地利、比利时、丹麦、芬兰、法国、德国、希腊、冰岛、爱尔兰、意大利、列支敦士登、卢森堡、荷兰、挪威、葡萄牙、西班牙、瑞典、英国" + "1、 中非：包括马拉维、赞比亚、津巴布韦"
				+ "2、 东非：包括布隆迪、吉布提、厄立特里亚、埃塞俄比亚、肯尼亚、卢旺达、索马里、坦桑尼亚、乌干达" + "3、 南非：包括博茨瓦纳、莱索托、莫桑比克、纳米比亚、南非、斯威士兰"
				+ "4、 西非：包括安哥拉、贝宁、布基纳法索、喀麦隆、佛得角、中非共和国、乍得、刚果（布）、刚果（金）、科特迪瓦、赤道几内亚、加蓬、冈比亚、加纳、几内亚、"
				+ "几内亚比绍、利比里亚、马里、毛里塔尼亚、尼日尔、尼日利亚、圣多美和普林西比、塞内加尔、塞拉利昂、多哥" + "5、 印度洋岛屿：包括科摩罗、马达加斯加、毛里求斯、马约特、留尼旺、塞舌尔"
				+ "6、 利比亚（利比亚属于非洲次区，但不属于上述任何小区）" + "还包括阿尔及利亚、加拿利群岛、埃及、马德拉群岛、摩洛哥、突尼斯、苏丹；但上述国家在IATA区域的划分中分属于欧洲和中东次区"
				+ "包括巴林、埃及、伊朗、伊拉克、以色列、约旦、科威特、黎巴嫩、卡塔尔、沙特阿拉伯、苏丹、阿曼、叙利亚、阿联酋、也门";
		String area3 = "包括阿富汗、孟加拉、不丹、印度、马尔代夫、尼泊尔、巴基斯坦、斯里兰卡"
				+ "包括文莱、柬埔寨、中国（不包括香港、澳门、台湾）、圣诞岛、澳属科科斯群岛、关岛、香港特别行政区、印度尼西亚、哈萨克斯坦、吉尔吉斯斯坦、"
				+ "老挝、澳门特别行政区、马来西亚、马绍尔群岛、密克罗尼西亚、蒙古、缅甸、北马里亚纳群岛、帕劳、菲律宾、俄罗斯（乌拉尔山以东）、新加坡、中国台湾省、塔吉克斯坦、泰国、土库曼斯坦、乌兹别克斯坦、越南"
				+ "包括美属萨摩亚、澳大利亚、库克群岛、斐济、法属波利尼西亚、基里巴斯、瑙鲁、新喀里多尼亚、新西兰、纽埃、巴布亚新几内亚、萨摩亚、所罗门群岛、汤加、图瓦卢、瓦努阿图、瓦利斯和富图纳群岛以及中间的所有岛屿"
				+ "包括日本、朝鲜、韩国";
		List<Country> countrys = this.findAllFromCache();
		for (Country country : countrys){
			String name = country.getCountryName();
			if (area1.indexOf(name) > -1){
				country.setIataArea("1");
				continue;
			}
			if (area2.indexOf(name) > -1){
				country.setIataArea("2");
				continue;
			}
			if (area3.indexOf(name) > -1){
				country.setIataArea("3");
			}
		}
		dao.update(countrys);
		for (Country country : countrys){
			if (ObjectUtil.noText(country.getIataArea())){
				System.out.println(country.getCountryName());
			}
		}
		System.out.println("处理完毕");
	}
	
	@Autowired
	private CityServiceImpl cityService;
	
	public void updateFromContinent(ContextInfo context) {
		List<Country> countrys = this.findAllFromCache();
		for (Country country : countrys){
			List<City> citys = cityService.getByCountryCode(context, country.getCountryCode());
			for (City city : citys){
				city.setIataArea(country.getIataArea());
			}
			cityDao.update(citys);
		}
		System.out.println("处理完毕");
	}
}
